#ifndef SPL_DROPTARGET
#define SPL_DROPTARGET

class FrameWnd::DropTarget : public IDropTarget
{
private:
#pragma region Declarations
  LONG m_lRefCount;		// reference count
  FrameWnd *wnd;          // window associated with this droptarget
#pragma endregion

public:
#pragma region IUnknown
  // Retrieves pointers to the supported interfaces on an object
  HRESULT WINAPI QueryInterface(REFIID iid, void **ppvObjectOut);
  // Increments the reference count for an interface on an object
  ULONG WINAPI AddRef();
  // Decrements the reference count for an interface on an object
  ULONG WINAPI Release();
#pragma endregion

#pragma region IDropTarget
  // Determines whether a drop can be accepted and its effect if
  // it is accepted
  HRESULT WINAPI DragEnter(IDataObject *pDataObject,
    DWORD grfKeyState, POINTL pt, DWORD *pdwEffectOut);
  // Provides target feedback to the user through the
  // DoDragDrop function
  HRESULT WINAPI DragOver(DWORD grfKeyState, POINTL pt,
    DWORD *pdwEffectOut);
  // Causes the drop target to suspend its feedback actions
  HRESULT WINAPI DragLeave();
  // Drops the data into the target window
  HRESULT WINAPI Drop(IDataObject *pDataObject, DWORD grfKeyState,
    POINTL pt, DWORD *pdwEffectOut);
#pragma endregion

#pragma region Helper Methods
  static DWORD DropEffect(DWORD grfKeyState, POINTL pt, DWORD dwAllowed);
#pragma endregion

#pragma region Constructors & Destructors
  DropTarget(FrameWnd *wnd);
#pragma endregion
};

#endif